/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ package org.squale.jraf.provider.persistence.hibernate; import java.io.Serializable; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.HibernateException; import org.hibernate.ObjectNotFoundException; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.criterion.Example; import org.hibernate.criterion.Expression; import org.hibernate.criterion.MatchMode; import org.hibernate.proxy.HibernateProxy; import org.hibernate.type.Type; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.helper.PersistenceHelper; import org.squale.jraf.spi.persistence.IMetaData; import org.squale.jraf.spi.persistence.IPersistenceDAO; import org.squale.jraf.spi.persistence.IPersistenceProvider; import org.squale.jraf.spi.persistence.ISession; /** * <p> * Project: JRAF * <p> * Module: jrafProviderPersistence * <p> * Title : AbstractDAOImpl.java * </p> * <p> * Description : * </p> * <p> * Copyright : Copyright (c) 2004 * </p> * <br> * Classe de la couche DAO: propose une impl�mentation de l'interface d'acc�s � l'ORM pour le produit Hibernate Il faut * <b>imp�rativement</b> utiliser la m�thode setBusinessClass dans le constructeur du DAO pour �tablir la valeur de la * clause from des requetes HQL. Par exemple pour une classe <b>EscaleDAOImpl</b> nous aurions le code:<br> * <b> <br> * private EscaleDAOImpl() throws JrafDaoException { <br> * <i> setBusinessClass(Escale.class);</i> <br> * </b> */ public abstract class AbstractDAOImpl implements IPersistenceDAO { /** logger */ private static final Log log = LogFactory.getLog( AbstractDAOImpl.class ); /** persistence provider */ private IPersistenceProvider persistentProvider = null; /** * variable contenant le d�but d'une requete. ex: pour une classe Foo nous aurons <b>from Foo as foo</b> */ private String requete = null; /** classe du bo lie */ private Class businessClass = null; /** alias du au bo lie */ private String alias = null; /** * COnstructeur par defaut */ protected AbstractDAOImpl() { super(); } /** * R�cup�rer un objet � partir de son identifiant. On le cherche d'abord en cache session, auquel cas rien ne se * passe <li>Si le mapping d�fini un proxy (voir iterate), une r�f�rence est ajout�e. <li>Sinon l'objet est lue en * base et cach� dans la session * * @param session session de persistance * @param oid valeur de l'identifiant * @return Objet charge. * @throws JrafDaoException */ public Object load( ISession session, Serializable oid ) throws JrafDaoException { Object obj = null; try { // Retrouver le nom de l'identifiant de clazz String id = getMetaData().getIdentifierName( getBusinessClass() ); Iterator it = iterate( session, " where " + getAlias() + "." + id + " = '" + oid + "'" ); if ( it != null && it.hasNext() ) { obj = it.next(); } } catch ( Exception e ) { throwDAOException( e, "load" ); } return obj; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#refresh(org.squale.jraf.spi.persistence.ISession, * java.lang.Object) */ public void refresh( ISession session, Object obj ) throws JrafDaoException { try { ( (SessionImpl) session ).getSession().refresh( obj ); } catch ( Exception e ) { throwDAOException( e, "refresh" ); } } /** * Force la lecture compl�te de l'objet qq soit le mapping (lasy true) Si l'objet existe sous forme de proxy, il est * remplac� par l'objet complet et mis en cache. Si l'object existe d�j� dans le cache, il n'est pas relu. * * @param session * @param clazz * @param id * @return * @throws JrafDaoException * @deprecated depuis JRAF v2.1. Cette methode va disparaitre. Utiliser la methode get(ISession, Serializable). */ public Object get( ISession session, Class clazz, Serializable id ) throws JrafDaoException { Object entity = null; try { entity = ( (SessionImpl) session ).getSession().get( clazz, id ); if ( entity != null && ( entity instanceof HibernateProxy ) ) { ( (SessionImpl) session ).getSession().evict( entity ); entity = ( (SessionImpl) session ).getSession().get( clazz, id ); } } catch ( HibernateException e ) { throwDAOException( e, "get" ); } return entity; } /** * Force la lecture compl�te de l'objet qq soit le mapping (lasy true) Si l'objet existe sous forme de proxy, il est * remplac� par l'objet complet et mis en cache. Si l'object existe d�j� dans le cache, il n'est pas relu. * * @param session session de persistance * @param id id de l'objet * @return l'objet trouve ou null * @throws JrafDaoException */ public Object get( ISession session, Serializable id ) throws JrafDaoException { Object entity = null; try { Class clazz = getBusinessClass(); entity = ( (SessionImpl) session ).getSession().get( clazz, id ); if ( entity != null && ( entity instanceof HibernateProxy ) ) { ( (SessionImpl) session ).getSession().evict( entity ); entity = ( (SessionImpl) session ).getSession().get( clazz, id ); } } catch ( HibernateException e ) { throwDAOException( e, "get" ); } return entity; } /** * Charge un objet depuis la base avec une relation (eager-fetching). Si l'objet est deja dans le cache des proxy, * il est efface puis repris de la base. * * @param session session de persistance * @param id id de l'objet a charge * @param relationName nom de la relation a charger * @return objet charge * @throws JrafDaoException */ public Object getWithRelation( ISession session, String relationName, Serializable id ) throws JrafDaoException { // resultat Object result = null; // recuperation de la session hibernate Session hSession = ( (SessionImpl) session ).getSession(); // creation d'un critere de recherche Criteria c = hSession.createCriteria( getBusinessClass() ); try { // on fixe le eager fetching sur la relation c.setFetchMode( relationName, FetchMode.JOIN ); // critere de recherche c.add( Expression.eq( getMetaData().getIdentifierName( getBusinessClass() ), id ) ); // un seul objet remonte result = c.uniqueResult(); // si l'element charge est un proxy, on l'efface du cache // et on recharge l'objet if ( result != null && ( result instanceof HibernateProxy ) ) { ( (SessionImpl) session ).getSession().evict( result ); // on recree le critere c = hSession.createCriteria( getBusinessClass() ); // on fixe le eager fetching sur la relation c.setFetchMode( relationName, FetchMode.JOIN ); // critere de recherche c.add( Expression.eq( getMetaData().getIdentifierName( getBusinessClass() ), id ) ); // un seul objet remonte result = c.uniqueResult(); } } catch ( HibernateException e ) { throwDAOException( e, "loadWithRelation" ); } return result; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#find(org.squale.jraf.spi.persistence.ISession, * java.lang.String) */ public java.util.List find( ISession session, String lRequete ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { liste = sessionHibernate.getSession().createQuery( lRequete ).list(); } catch ( Exception e ) { throwDAOException( e, "find" ); } return liste; } /** * With this method you could do a search restricted to a number of result to return. * * @param session The hibernate session to use * @param lRequete The request * @param nbLignes The number of lines to retrieve * @param indexDepart The first line to retrieve * @return The results found * @throws JrafDaoException exception happened during the search */ public java.util.List findScrollable( ISession session, String lRequete, int nbLignes, int indexDepart ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { Query q = sessionHibernate.getSession().createQuery( lRequete ).setFirstResult( indexDepart ).setMaxResults( nbLignes ); liste = q.list(); } catch ( Exception e ) { throwDAOException( e, "findScrollable" ); } return liste; } /** * Execute la requete en valorisant les parametres. Les paramametres sont passes sous forme de tableau dans l'ordre * de la requete. Requ�te libre en langage OQL ou SQL suivant l'impl�mentation du moteur d'acc�s aux donn�es. La * clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = ?'</li> * * @param session session a utiliser * @param lRequete requete HQL executee * @param values tableau de valeurs * @param types tableau des types * @return liste d'objets retrouves * @throws JrafDaoException exception */ public java.util.List find( ISession session, String lRequete, Object[] values, Type[] types ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { Query query = sessionHibernate.getSession().createQuery( lRequete ); query.setParameters( values, types ); liste = query.list(); } catch ( Exception e ) { throwDAOException( e, "find" ); } return liste; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#find(org.squale.jraf.spi.persistence.ISession, * java.lang.String, java.lang.Object) */ public java.util.List find( ISession session, String lRequete, Object bean ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { Query query = sessionHibernate.getSession().createQuery( lRequete ); query.setProperties( bean ); liste = query.list(); } catch ( Exception e ) { throwDAOException( e, "find" ); } return liste; } /* * @see org.squale.jraf.spi.persistence.IPersistenceDAO#findAll(ISession) */ public List findAll( ISession session ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { liste = sessionHibernate.getSession().createQuery( getRequete() ).list(); } catch ( Exception e ) { throwDAOException( e, "findAll" ); } return liste; } /** * La construction de la requete utilise la m�thode getRequete() pour initialiser le d�but de la clause. * * @param session session a utiliser * @param whereClause requete HQL executee * @return liste d'objets trouves */ public java.util.List findWhere( ISession session, String whereClause ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { liste = sessionHibernate.getSession().createQuery( getRequete() + whereClause ).list(); } catch ( Exception e ) { throwDAOException( e, "findWhere" ); } return liste; } /** * La construction de la requete utilise la m�thode getRequete() pour initialiser le d�but de la clause. Les * paramametres sont passes sous forme de tableau dans l'ordre de la requete. * * @param session session a utiliser * @param whereClause requete HQL executee * @param values tableau de valeurs * @param types tableau des types * @return liste d'objets trouves */ public java.util.List findWhere( ISession session, String whereClause, Object[] values, Type[] types ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { Query query = sessionHibernate.getSession().createQuery( getRequete() + whereClause ); query.setParameters( values, types ); liste = query.list(); } catch ( Exception e ) { throwDAOException( e, "findWhere" ); } return liste; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#findWhere(org.squale.jraf.spi.persistence.ISession, * java.lang.String, java.lang.Object) */ public java.util.List findWhere( ISession session, String whereClause, Object bean ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; List liste = null; try { Query query = sessionHibernate.getSession().createQuery( getRequete() + whereClause ); query.setProperties( bean ); liste = query.list(); } catch ( Exception e ) { throwDAOException( e, "findWhere" ); } return liste; } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findWhereScrollable(org.squale.jraf.spi.persistence.ISession * , java.lang.String, int, int, boolean) */ public Object findWhereScrollable( ISession session, String whereClause, int nbLignes, int indexDepart, boolean bCaching ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; Object obj = null; try { // log.logPourDebug("requete:" + getRequete() + whereClause); Query q = sessionHibernate.getSession().createQuery( getRequete() + whereClause ).setFirstResult( indexDepart ).setMaxResults( nbLignes ); if ( bCaching ) { obj = q.iterate(); } else { obj = q.list(); } } catch ( Exception e ) { throwDAOException( e, "findWhereScrollable" ); } return obj; } /** * Method findWhereScrollable. Retourne nbligne de la requete pass�e en argument Si la clause where existe, elle * doit comporter une clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = ?'</li> Sinon, elle * peut �tre nulle dans ce cas il s'agit d'un select * * * @param whereClause Requete a executer * @param session session utilisee * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @param nbLignes Nombre de lignes a retourner * @param indexDepart Index de lma premiere ligne a retourner * @param bCaching Si <b>true</b> retourne utilise l'API iterate() sinon list() * @return Object soit une List si bcaching = true. soit un Iterator si bcaching = false. * @throws JrafDaoException */ public Object findWhereScrollable( ISession session, String whereClause, Object[] values, Type[] types, int nbLignes, int indexDepart, boolean bCaching ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; Object obj = null; try { // log.logPourDebug("requete:" + getRequete() + whereClause); Query q = sessionHibernate.getSession().createQuery( getRequete() + whereClause ).setFirstResult( indexDepart ).setMaxResults( nbLignes ).setParameters( values, types ); if ( bCaching ) { obj = q.iterate(); } else { obj = q.list(); } } catch ( Exception e ) { throwDAOException( e, "findWhereScrollable" ); } return obj; } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findWhereScrollable(org.squale.jraf.spi.persistence.ISession * , java.lang.String, int, int, boolean) */ public Object findWhereScrollable( ISession session, String whereClause, Object bean, int nbLignes, int indexDepart, boolean bCaching ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; Object obj = null; try { // log.logPourDebug("requete:" + getRequete() + whereClause); Query q = sessionHibernate.getSession().createQuery( getRequete() + whereClause ).setFirstResult( indexDepart ).setMaxResults( nbLignes ).setProperties( bean ); if ( bCaching ) { obj = q.iterate(); } else { obj = q.list(); } } catch ( Exception e ) { throwDAOException( e, "findWhereScrollable" ); } return obj; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#create(org.squale.jraf.spi.persistence.ISession, * java.lang.Object) */ public void create( ISession session, Object obj ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; try { sessionHibernate.getSession().save( obj ); } catch ( Exception e ) { throwDAOException( e, "create" ); } } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#save(org.squale.jraf.spi.persistence.ISession, * java.lang.Object) */ public void save( ISession session, Object obj ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; try { sessionHibernate.getSession().saveOrUpdate( obj ); } catch ( Exception e ) { throwDAOException( e, "save" ); } } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#remove(org.squale.jraf.spi.persistence.ISession, * java.lang.Object) */ public void remove( ISession session, Object obj ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; try { sessionHibernate.getSession().delete( obj ); } catch ( Exception e ) { throwDAOException( e, "remove" ); } } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#removeAll(org.squale.jraf.spi.persistence.ISession) */ public void removeAll( ISession session ) throws JrafDaoException { removeWhere( session, "" ); } /** * Impl�mentation sp�cifique Hibernate<br> * Supression d'un sous ensemble selectionn� suivant une requete HQL. Si la clause where existe, elle doit etre une * clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = a'</li> Sinon, elle peut �tre nulle * dans ce cas il s'agit d'un delete * * * @param session * @param whereClause clause where de la requete HQL. * @return nombre d'instance supprime * @throws JrafDaoException */ public int removeWhere( ISession session, String whereClause ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; String req = "delete " + getClassName( getBusinessClass() ) + " " + getAlias() + " "; int nbInstanceSupprime = 0; try { nbInstanceSupprime = sessionHibernate.getSession().createQuery( req + whereClause ).executeUpdate(); } catch ( Exception e ) { throwDAOException( e, "removeAll" ); } return nbInstanceSupprime; } /** * Impl�mentation sp�cifique Hibernate<br> * Supression d'un sous ensemble selectionn� suivant une requete HQL. Si la clause where existe, elle doit etre une * clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = ?'</li> Sinon, elle peut �tre nulle * dans ce cas il s'agit d'un delete * * * @param session * @param whereClause clause where de la requete HQL. * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return nombre d'instance supprime * @throws JrafDaoException */ public int removeWhere( ISession session, String whereClause, Object[] values, Type[] types ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; String req = "delete " + getClassName( getBusinessClass() ) + " " + getAlias() + " "; int nbInstanceSupprime = 0; try { Query query = sessionHibernate.getSession().createQuery( req + whereClause ); query.setParameters( values, types ); nbInstanceSupprime = query.executeUpdate(); } catch ( Exception e ) { throwDAOException( e, "removeAll" ); } return nbInstanceSupprime; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#removeWhere(org.squale.jraf.spi.persistence.ISession, * java.lang.String, java.lang.Object) */ public int removeWhere( ISession session, String whereClause, Object bean ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; String req = "delete " + getClassName( getBusinessClass() ) + " " + getAlias() + " "; int nbInstanceSupprime = 0; try { Query query = sessionHibernate.getSession().createQuery( req + whereClause ); query.setProperties( bean ); nbInstanceSupprime = query.executeUpdate(); } catch ( Exception e ) { throwDAOException( e, "removeAll" ); } return nbInstanceSupprime; } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode permet de ne pas forcer la * lecture compl�tes des objets. Par ailleurs les objets sans proxy sont mis dans le cache de la session. <br> * <br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = a'</li> * <br> * <br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement pour les * objets qui seront r�ellement concr�tis�s. <br> * * @param sessionHibernate * @param whereClause * @return Iterator * @throws JrafDaoException */ public Iterator iterate( ISession session, String whereClause ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; String req = null; Iterator iter = null; try { req = getRequete() + whereClause; iter = sessionImpl.getSession().createQuery( req ).iterate(); } catch ( Exception e ) { throwDAOException( e, "iterate: " + req ); } return iter; } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode permet de ne pas forcer la * lecture compl�tes des objets. Par ailleurs les objets sans proxy sont mis dans le cache de la session. <br> * <br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = ?'</li> * <br> * <br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement pour les * objets qui seront r�ellement concr�tis�s. <br> * * @param sessionHibernate * @param whereClause * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return Iterator * @throws JrafDaoException */ public Iterator iterate( ISession session, String whereClause, Object[] values, Type[] types ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; String req = null; Iterator iter = null; try { req = getRequete() + whereClause; iter = sessionImpl.getSession().createQuery( req ).setParameters( values, types ).iterate(); } catch ( Exception e ) { throwDAOException( e, "iterate: " + req ); } return iter; } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode permet de ne pas forcer la * lecture compl�tes des objets. Par ailleurs les objets sans proxy sont mis dans le cache de la session. <br> * <br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = * :avion'</li> <br> * <br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement pour les * objets qui seront r�ellement concr�tis�s. <br> * * @param sessionHibernate * @param whereClause * @param bean Bean ou sont lu les parametres de la requete * @return Iterator * @throws JrafDaoException */ public Iterator iterate( ISession session, String whereClause, Object bean ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; String req = null; Iterator iter = null; try { req = getRequete() + whereClause; iter = sessionImpl.getSession().createQuery( req ).setProperties( bean ).iterate(); } catch ( Exception e ) { throwDAOException( e, "iterate: " + req ); } return iter; } /** * Impl�mentation sp�cifique Hibernate<br> * Method filter. Restreint une liste suivant une clause Hql. Retourne une List * * @param sessionHibernate * @param liste = List d'objets � restreindre * @param clause * @return Collection * @throws JrafDaoException */ public List filter( ISession session, Object liste, String clause ) throws JrafDaoException { List list = null; try { SessionImpl sessionImpl = (SessionImpl) session; list = sessionImpl.getSession().createFilter( liste, clause ).list(); } catch ( Exception e ) { throwDAOException( e, "filter" ); } return list; } /** * Impl�mentation sp�cifique Hibernate<br> * Method filter. Restreint une liste suivant une clause Hql. Retourne une List * * @param sessionHibernate * @param liste = List d'objets � restreindre * @param clause * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return List * @throws JrafDaoException */ public List filter( ISession session, Object liste, String clause, Object[] values, Type[] types ) throws JrafDaoException { List list = null; try { SessionImpl sessionImpl = (SessionImpl) session; list = sessionImpl.getSession().createFilter( liste, clause ).setParameters( values, types ).list(); } catch ( Exception e ) { throwDAOException( e, "filter" ); } return list; } /** * Impl�mentation sp�cifique Hibernate<br> * Method filter. Restreint une liste suivant une clause Hql. Retourne une List * * @param sessionHibernate * @param liste = List d'objets � restreindre * @param clause * @param bean Bean ou sont lu les parametres de la requete * @return List * @throws JrafDaoException */ public List filter( ISession session, Object liste, String clause, Object bean ) throws JrafDaoException { List list = null; try { SessionImpl sessionImpl = (SessionImpl) session; list = sessionImpl.getSession().createFilter( liste, clause ).setProperties( bean ).list(); } catch ( Exception e ) { throwDAOException( e, "filter" ); } return list; } /** * G�n�rer une exception de niveau DAO * * @param e * @param methodName * @throws JrafDaoException */ protected void throwDAOException( Exception e, String methodName ) throws JrafDaoException { log.error( "Erreur AbstractDAOImpl methode :" + methodName, e ); throw new JrafDaoException( "Erreur AbstractDAOImpl methode :" + methodName, e ); } /** * Impl�mentation sp�cifique Hibernate<br> * la variable requete contient la partie fixe de la requete OQL par exemple <b> from Avion as avion</b> pour un DAO * de type AvionDAOImpl * * @return String */ public String getRequete() { if ( requete == null ) { if ( getBusinessClass() != null ) { requete = "from " + getClassName( getBusinessClass() ) + " as " + getAlias() + " "; } } return requete; } /** * Impl�mentation sp�cifique Hibernate<br> * la variable requete contient la partie fixe de la requete OQL par exemple <b> from Avion as avion</b> pour un DAO * de type AvionDAOImpl * * @param req The requete to set */ protected void setRequete( String req ) { this.requete = req; } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#count(org.squale.jraf.spi.persistence.ISession) */ public Integer count( ISession session ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; try { return ( (Integer) sessionImpl.getSession().createQuery( "select count(*) " + getRequete() ).iterate().next() ); } catch ( Exception e ) { throw new JrafDaoException( e.getMessage() ); } } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#countWhere(org.squale.jraf.spi.persistence.ISession, * java.lang.String) */ public Integer countWhere( ISession session, String whereClause ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; try { return ( (Integer) sessionImpl.getSession().createQuery( "select count(*) " + getRequete() + whereClause ).iterate().next() ); } catch ( Exception e ) { throw new JrafDaoException( "requete: select count(*) " + getRequete() + whereClause + " message: " + e.getMessage() ); } } /** * Retourne le nombre d'objets en fonction de la clause where Si la clause where existe, elle doit comporter une * clause where valide incluant le mot cl� <b>Where</b <li>ie: 'where Avion = ?'</li> Sinon, elle peut �tre nulle * dans ce cas il s'agit d'un <b>select *</b> * * @param session * @param whereClause * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types hibernate des parametres de la requete (ex Hibernate.STRING) * @return Integer Nombre d'�l�ment trouv�. * @throws JrafDaoException */ public Integer countWhere( ISession session, String whereClause, Object[] values, Type[] types ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; try { return ( (Integer) sessionImpl.getSession().createQuery( "select count(*) " + getRequete() + whereClause ).setParameters( values, types ).iterate().next() ); } catch ( Exception e ) { throw new JrafDaoException( "requete: select count(*) " + getRequete() + whereClause + " message: " + e.getMessage() ); } } /* * (non-Javadoc) * @see org.squale.jraf.spi.persistence.IPersistenceDAO#countWhere(org.squale.jraf.spi.persistence.ISession, * java.lang.String, java.lang.Object) */ public Integer countWhere( ISession session, String whereClause, Object bean ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; try { return ( (Integer) sessionImpl.getSession().createQuery( "select count(*) " + getRequete() + whereClause ).setProperties( bean ).iterate().next() ); } catch ( Exception e ) { throw new JrafDaoException( "requete: select count(*) " + getRequete() + whereClause + " message: " + e.getMessage() ); } } /** * Retourne l'alias * * @return alias */ protected String getAlias() { if ( alias == null ) { alias = getClassName( getBusinessClass() ).toLowerCase(); } return alias; } /** * @param string */ private void setAlias( String string ) { alias = string; } /** * Retourne la classe metier liee au DAO * * @return classe metier liee au DAO */ protected Class getBusinessClass() { return businessClass; } /** * Fixe le bo lie * * @param class1 bo lie */ private void setBusinessClass( Class class1 ) { businessClass = class1; } /** * Retourne le nom court de la classe * * @param class1 objet class * @return nom court de la classe */ private static String getClassName( Class class1 ) { int index = class1.getName().lastIndexOf( "." ); return ( class1.getName().substring( index + 1 ) ); } /** * Initialize le DAO Important : Cette methode ne doit etre appelee qu'une seule fois lors de la creation d'une * instance de DAO par le constructeur. * * @param clazz classe metier liee * @param persistenceProvider provider de persistance */ protected void initialize( Class clazz, IPersistenceProvider persistenceProvider ) { // reinitialise clean(); setBusinessClass( clazz ); setPersistentProvider( persistenceProvider ); } /** * Initialize le DAO. Utilise le provider de persistance par d�faut. Important : Cette methode ne doit etre appelee * qu'une seule fois lors de la creation d'une instance de DAO par le constructeur. * * @param clazz classe metier liee */ protected void initialize( Class clazz ) { initialize( clazz, PersistenceHelper.getPersistenceProvider() ); } /** * Retourne les metadata du provider de persistance * * @return metadata */ protected IMetaData getMetaData() { return persistentProvider.getMetaData(); } /** * Retourne le provider de persistance * * @return provider de persistance */ protected IPersistenceProvider getPersistentProvider() { return persistentProvider; } /** * Fixe le provider de persistance * * @param provider */ protected void setPersistentProvider( IPersistenceProvider provider ) { persistentProvider = provider; } /** * Reinitialise l'ensemble des proprietes */ private void clean() { setRequete( null ); setBusinessClass( null ); setAlias( null ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object, int, int, boolean, boolean) */ public List findByExample( ISession session, Object bo, int nbLignes, int indexDepart, boolean ignoreCase, boolean likeMode ) throws JrafDaoException { return findByExample( session, bo, nbLignes, indexDepart, ignoreCase, likeMode, false ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object, int, int, boolean, boolean, boolean) */ public List findByExample( ISession session, Object bo, int nbLignes, int indexDepart, boolean ignoreCase, boolean likeMode, boolean cache ) throws JrafDaoException { return findByExample( session, bo, nbLignes, indexDepart, ignoreCase, likeMode, cache, -1 ); } /** * Execute un find a partir d'un objet exemple * * @param session session de persistance * @param bo businness object exemple * @param nbLignes nombre de lignes * @param indexDepart index de depart * @param ignoreCase ignore la casse * @param likeMode mode like * @param cache true si les elements retournes sont mis en cache, false sinon * @return liste d'objets retrouves * @throws JrafDaoException */ public List findByExample( ISession session, Object bo, int nbLignes, int indexDepart, boolean ignoreCase, boolean likeMode, boolean cache, int matchMode ) throws JrafDaoException { SessionImpl sessionImpl = (SessionImpl) session; Criteria crit = sessionImpl.getSession().createCriteria( bo.getClass() ); Example example = Example.create( bo ); // ignore la casse if ( ignoreCase ) { example.ignoreCase(); } // mode like if ( likeMode ) { switch ( matchMode ) { case 0: example.enableLike( MatchMode.START ); break; case 1: example.enableLike( MatchMode.END ); break; default: example.enableLike( MatchMode.ANYWHERE ); break; } } // ajout de l'example crit.add( example ); if ( indexDepart > -1 ) { crit.setFirstResult( indexDepart ); } if ( nbLignes > 0 ) { crit.setMaxResults( nbLignes ); } crit.setCacheable( cache ); List l = null; try { l = crit.list(); } catch ( HibernateException e ) { throwDAOException( e, "findByExample" ); } return l; } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object) */ public List findByExample( ISession session, Object bo ) throws JrafDaoException { return findByExample( session, bo, -1, -1, false, false, false ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object, boolean, boolean) */ public List findByExample( ISession session, Object bo, boolean ignoreCase, boolean likeMode ) throws JrafDaoException { return findByExample( session, bo, -1, -1, ignoreCase, likeMode, false ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object, int, int) */ public List findByExample( ISession session, Object bo, int nbLignes, int indexDepart ) throws JrafDaoException { return findByExample( session, bo, nbLignes, indexDepart, false, false, false ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#findByExample(org.squale.jraf.spi.persistence.ISession, * java.lang.Object, int, int, boolean) */ public List findByExample( ISession session, Object bo, int nbLignes, int indexDepart, boolean cache ) throws JrafDaoException { return findByExample( session, bo, nbLignes, indexDepart, false, false, cache ); } /** * cr�ation d'une query � partir d'une requ�te sql, reprise d'une fonctionnalit� d'Hibernate pour �viter d'avoir � * importer les packages Hibernate dans les DAO de l'application cf API de la classe org.hibernate.Session * * @param session * @param sql * @return */ public SQLQuery createSQLQuery( ISession session, String sql ) { SessionImpl sessionImpl = (SessionImpl) session; return sessionImpl.getSession().createSQLQuery( sql ); } /** * cr�ation d'une query � partir d'une requ�te sql, reprise d'une fonctionnalit� d'Hibernate pour �viter d'avoir � * importer les packages Hibernate dans les DAO de l'application cf API de la classe org.hibernate.Session * * @param session * @param sql * @param returnAliases * @param returnClasses * @return */ public SQLQuery createSQLQuery( ISession session, String sql, String[] returnAliases, Class[] returnClasses ) { SessionImpl sessionImpl = (SessionImpl) session; SQLQuery query = sessionImpl.getSession().createSQLQuery( sql ); for ( int i = 0; i < returnAliases.length; i++ ) { query.addEntity( returnAliases[i], returnClasses[i] ); } return query; } /** * cr�ation d'une query � partir d'une requ�te sql, reprise d'une fonctionnalit� d'Hibernate pour �viter d'avoir � * importer les packages Hibernate dans les DAO de l'application cf API de la classe org.hibernate.Session * * @param session * @param sql * @param returnAlias * @param returnClass * @return */ public SQLQuery createSQLQuery( ISession session, String sql, String returnAlias, Class returnClass ) { SessionImpl sessionImpl = (SessionImpl) session; return sessionImpl.getSession().createSQLQuery( sql ).addEntity( returnAlias, returnClass ); } /* * (non-Javadoc) * @see * org.squale.jraf.spi.persistence.IPersistenceDAO#loadFromSession(org.squale.jraf.spi.persistence.ISession, * java.io.Serializable) */ public Object loadFromSession( ISession session, Serializable oid ) throws JrafDaoException { SessionImpl sessionHibernate = (SessionImpl) session; Object loaded = null; try { loaded = sessionHibernate.getSession().load( getBusinessClass(), oid ); } catch ( ObjectNotFoundException e ) { // Eliminer le cas ou on a une proxy deja lu. if ( log.isDebugEnabled() ) { log.debug( "l'objet " + getBusinessClass() + "." + oid + " n'a pas ete trouve : " + e.getMessage() ); } } catch ( HibernateException e ) { // autre type d'exception throwDAOException( e, "loadFromSession" ); throw new JrafDaoException( e ); } return loaded; } }